package com.cvpoc.hibernate.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.joda.time.DateTime;
import org.springframework.beans.BeanUtils;
import org.springframework.orm.hibernate3.HibernateObjectRetrievalFailureException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.cvpoc.dto.FormationInitialeDTO;
import com.cvpoc.hibernate.dao.FormationInitialeDao;
import com.cvpoc.model.FormationInitiale;

public class FormationInitialeDaoImpl extends HibernateDaoSupport implements
		FormationInitialeDao {

	@Override
	public Integer createFormationInitiale(
			FormationInitialeDTO pFormationInitialeDTO) {
		FormationInitiale formationInitiale = getFormationInitiale(pFormationInitialeDTO);
		return (Integer) getHibernateTemplate().save(formationInitiale);
	}

	@Override
	public FormationInitialeDTO findFormationInitialeById(
			int idFormationInitiale) {
		try {
			return getFormationInitialeDTO(getHibernateTemplate().get(
					FormationInitiale.class, idFormationInitiale));
		} catch (HibernateObjectRetrievalFailureException ex) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<FormationInitialeDTO> findFormationInitialeByIdCollaborateur(
			int idCollaborateur) {

		DetachedCriteria dc = DetachedCriteria
				.forClass(FormationInitiale.class);
		dc.add(Restrictions.eq("id_collaborateur", idCollaborateur));

		List<FormationInitiale> listeFormationsInitiales = getHibernateTemplate()
				.findByCriteria(dc);
		return getListeFormationInitialeDTO(listeFormationsInitiales);
	}

	@Override
	public void deleteFormationInitiale(int pIdFormationInitialeDTO) {
		FormationInitiale formationInitiale = getHibernateTemplate().load(
				FormationInitiale.class, pIdFormationInitialeDTO);
		getHibernateTemplate().delete(formationInitiale);
	}

	@Override
	public void updateFormationInitiale(
			FormationInitialeDTO pFormationInitialeDTO) {
		FormationInitiale formationInitiale = getFormationInitiale(pFormationInitialeDTO);
		getHibernateTemplate().merge(formationInitiale);
	}

	private static FormationInitialeDTO getFormationInitialeDTO(
			FormationInitiale pFormationInitiale) {
		FormationInitialeDTO formationInitialeDTO = new FormationInitialeDTO();
		BeanUtils.copyProperties(pFormationInitiale, formationInitialeDTO, new String[] {"dateDebut","dateFin"});
		formationInitialeDTO.setDateDebut(new DateTime(pFormationInitiale.getDateDebut()));
		formationInitialeDTO.setDateFin(new DateTime(pFormationInitiale.getDateFin()));
		return formationInitialeDTO;
	}

	private static List<FormationInitialeDTO> getListeFormationInitialeDTO(
			List<FormationInitiale> pListeFormationInitiales) {
		List<FormationInitialeDTO> listeFormationInitialeDTO = new ArrayList<FormationInitialeDTO>();
		for (FormationInitiale formationInitiale : pListeFormationInitiales) {
			listeFormationInitialeDTO
					.add(getFormationInitialeDTO(formationInitiale));
		}
		return listeFormationInitialeDTO;
	}

	private FormationInitiale getFormationInitiale(
			FormationInitialeDTO pFormationInitialeDTO) {
		FormationInitiale formationInitiale = new FormationInitiale();
		BeanUtils.copyProperties(pFormationInitialeDTO, formationInitiale, new String[] {"dateDebut","dateFin"});
		formationInitiale.setDateDebut(pFormationInitialeDTO.getDateDebut().toDate());
		formationInitiale.setDateFin(pFormationInitialeDTO.getDateFin().toDate());
		return formationInitiale;
	}

}
